import * as tools from 'src-ssr/util/common';
import rp from 'request-promise';
import api from 'src-ssr/util/wechat_api';

/**
 * @function 发送微信模板消息
 * @param {string} openid 微信openid
 * @param {string} id 模板id
 * @param {object} data 模板消息数据
 * @param {string} url 链接
 * @param {number} tid 租户id
 * */
export const sendTemplate = async (openid, { id, data }, url, tid = 0) => {
  if (!openid || !id || !data) {
    console.error('发送微信模板消息参数缺失', openid, id, data);
    return { result: 'fail', error: { message: '发送微信模板消息参数缺失', openid, id, data } };
  }
  const config = await tools.getSystemConfig('wechat', tid);

  const { appid, secret, access_token_url, template } = config;
  if (!appid || !secret) {
    console.error('未配置appid, secret', appid, secret);
    return { result: 'fail', error: { message: '未配置appid, secret', appid, secret } };
  }

  // 加载模板
  if (!template) {
    console.error('未定义微信模板消息的模板');
    return { result: 'fail', error: { message: '未定义微信模板消息的模板' } };
  }
  const wx_template = template.filter(v => v.id === id);
  if (wx_template.length === 0) {
    console.error(`未定义 ${id} 微信模板消息的模板`);
    return { result: 'fail', error: { message: `未定义 ${id} 微信模板消息的模板`, id } };
  }

  const message = JSON.parse(JSON.stringify(wx_template[0].data));
  // 消息赋值
  for (const key in message) {
    message[key].value = data[key] || '';
  }

  let accessToken = '';
  const ret = await api.access_token();
  if (ret.result === 'fail') {
    return ret;
  } else {
    accessToken = ret.accessTokenData.accessToken;
  }

  // 发送消息
  try {
    let msgRet = await rp({
      method: 'POST',
      uri: 'https://api.weixin.qq.com/cgi-bin/message/template/send',
      qs: {
        access_token: accessToken
      },
      body: {
        touser: openid,
        template_id: wx_template[0].template_id,
        url,
        appid,
        data: message
      },
      json: true
    });
    if (typeof msgRet === 'string') msgRet = JSON.parse(msgRet);

    return { result: msgRet.errmsg == 'ok' ? 'ok' : 'fail', msgRet, msgBody: message };
  } catch (err) {
    console.error('发送模板消息时出错', err);
    return { result: 'fail', error: { message: '发送模板消息时出错', err } }
  }
}

export default { sendTemplate };
